package cn.iocoder.yudao.module.system.dal.mysql.wishlist;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.wishlist.vo.UserWishListPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.wishlist.UserWishListDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 用户志愿表 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface UserWishListMapper extends BaseMapperX<UserWishListDO> {

    default PageResult<UserWishListDO> selectPage(UserWishListPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<UserWishListDO>()
                .eqIfPresent(UserWishListDO::getUserId, reqVO.getUserId())
                .likeIfPresent(UserWishListDO::getSchoolName, reqVO.getSchoolName())
                .likeIfPresent(UserWishListDO::getMajorName, reqVO.getMajorName())
                .eqIfPresent(UserWishListDO::getWishType, reqVO.getWishType())
                .eqIfPresent(UserWishListDO::getYear, reqVO.getYear())
                .orderByAsc(UserWishListDO::getWishType)
                .orderByAsc(UserWishListDO::getWishOrder)
                .orderByDesc(UserWishListDO::getCreateTime));
    }

    default List<UserWishListDO> selectListByUserId(Long userId) {
        return selectList(new LambdaQueryWrapperX<UserWishListDO>()
                .eq(UserWishListDO::getUserId, userId)
                .orderByAsc(UserWishListDO::getWishType)
                .orderByAsc(UserWishListDO::getWishOrder)
                .orderByDesc(UserWishListDO::getCreateTime));
    }

    default List<UserWishListDO> selectListByUserIdAndWishType(Long userId, String wishType) {
        return selectList(new LambdaQueryWrapperX<UserWishListDO>()
                .eq(UserWishListDO::getUserId, userId)
                .eq(UserWishListDO::getWishType, wishType)
                .orderByAsc(UserWishListDO::getWishOrder)
                .orderByDesc(UserWishListDO::getCreateTime));
    }

    default UserWishListDO selectByUserIdAndSchoolAndMajor(Long userId, String schoolUuid, String majorName, Integer year) {
        return selectOne(new LambdaQueryWrapperX<UserWishListDO>()
                .eq(UserWishListDO::getUserId, userId)
                .eq(UserWishListDO::getSchoolUuid, schoolUuid)
                .eq(UserWishListDO::getMajorName, majorName)
                .eq(UserWishListDO::getYear, year));
    }

    default Long selectCountByUserIdAndWishType(Long userId, String wishType) {
        return selectCount(new LambdaQueryWrapperX<UserWishListDO>()
                .eq(UserWishListDO::getUserId, userId)
                .eq(UserWishListDO::getWishType, wishType));
    }

    /**
     * 获取用户的第一个志愿记录（用于检测用户基本信息）
     */
    default UserWishListDO selectFirstByUserId(Long userId) {
        return selectOne(new LambdaQueryWrapperX<UserWishListDO>()
                .eq(UserWishListDO::getUserId, userId)
                .orderByAsc(UserWishListDO::getCreateTime)
                .last("LIMIT 1"));
    }

    /**
     * 删除用户的所有志愿记录
     */
    default int deleteByUserId(Long userId) {
        return delete(new LambdaQueryWrapperX<UserWishListDO>()
                .eq(UserWishListDO::getUserId, userId));
    }

    /**
     * 统计用户在相同省份、选科和分数条件下的志愿数量
     */
    default Long selectCountByUserIdAndConditions(Long userId, String userProvince, String userSubjectSelection, Integer userTotalScore) {
        return selectCount(new LambdaQueryWrapperX<UserWishListDO>()
                .eq(UserWishListDO::getUserId, userId)
                .eq(UserWishListDO::getUserProvince, userProvince)
                .eq(UserWishListDO::getUserSubjectSelection, userSubjectSelection)
                .eq(UserWishListDO::getUserTotalScore, userTotalScore));
    }

}
